Data Source

  • These data come from the FCC's data on broadband availability.
  • FCC data is released biannually on a year and half delay from when it was collected. New data can be downloaded from this link.
  • Data presented here are from June of 2020.

Data specifics

  • All internet providers must submit form 477 to the FCC biannually detailing the Maximum download and upload speeds (Mbps) they advertise to consumers along with other information about the company.
  • The FCC makes these data publicly available on a year and a half delay from when all 477 forms are submitted.
    • Limitations: (1) The data are available at the census block level, but are likely to overstate coverage because if an internet provider provides internet to a single person in a census block, the entire census block is marked as having coverage by that provider.
    • Strengths: (1) These are the same data used by the government to make policy decisions regarding broadband access. (2) Trump signed an act into law in March of 2020 that is supposed to improve the limitation listed above.

Variable descriptions

meta %>% 
  filter(su_block == 1) %>%
  select(varname, about) %>% as.list()
## $varname
## [1] "blockcode"     "Blkgr"         "tract"         "consproviders"
## [5] "busproviders"  "avgMaxAdDown"  "avgMaxAdUp"    "under25.3mbps"
## 
## $about
## [1] "15-digit block code"                                                                                                                                                                
## [2] "12-digit block group code"                                                                                                                                                          
## [3] "11-digit tract code"                                                                                                                                                                
## [4] "The number of consumer internet providers in the su"                                                                                                                                
## [5] "The number of business internet providers in the su"                                                                                                                                
## [6] "The average maximum advertised download speed by each broadband provider in the su"                                                                                                 
## [7] "The average maxmum advertised upload speed by each broadband provider in the su"                                                                                                    
## [8] "Binary indicator of whether the block has internet speeds of 25/3 Mbps. This benchmark is used by the FCC to determine whether a su has \"advanced telecommunications capability\"."
glimpse(eastdat)
## Rows: 6,469
## Columns: 8
## $ BlockCode     <dbl> 5.100109e+14, 5.100109e+14, 5.100109e+14, 5.100109e+14, …
## $ Blkgr         <dbl> 510010901001, 510010901001, 510010901001, 510010901001, …
## $ consproviders <int> 8, 5, 4, 5, 6, 7, 7, 7, 8, 3, 6, 7, 3, 3, 3, 5, 8, 6, 7,…
## $ busproviders  <int> 9, 5, 5, 5, 7, 8, 8, 8, 10, 3, 7, 8, 4, 4, 4, 5, 9, 7, 9…
## $ avgMaxAdDown  <dbl> 340.2222, 604.0000, 200.4000, 604.0000, 429.5714, 131.25…
## $ avgMaxAdUp    <dbl> 228.366667, 410.000000, 8.460000, 410.000000, 291.866857…
## $ tract         <dbl> 51001090100, 51001090100, 51001090100, 51001090100, 5100…
## $ under25.3mbps <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0,…
eastdat %>% select(consproviders, busproviders, avgMaxAdDown, avgMaxAdUp, under25.3mbps) %>% 
  select(where(~is.numeric(.x))) %>% 
  as.data.frame() %>% 
  stargazer(., type = "text", title = "Summary Statistics", digits = 2,
            summary.stat = c("mean", "sd", "min", "median", "max"))
## 
## Summary Statistics
## ===================================================
## Statistic      Mean  St. Dev.  Min  Median   Max   
## ---------------------------------------------------
## consproviders  4.33    2.04     1     4       9    
## busproviders   5.12    2.36     1     5       11   
## avgMaxAdDown  210.17  188.18  13.00 157.43 1,050.00
## avgMaxAdUp    121.64  164.36  1.46   7.18  1,001.50
## under25.3mbps  0.08    0.28     0     0       1    
## ---------------------------------------------------

Visual distribution

eastdat %>% select(c(BlockCode, consproviders, busproviders, avgMaxAdDown, avgMaxAdUp)) %>% 
  pivot_longer(-BlockCode, names_to = "measure", values_to = "value") %>%
  ggplot(aes(x = value, fill = measure)) +
  scale_fill_viridis(option = "plasma", discrete = TRUE, guide = FALSE) +
  geom_histogram() + 
  facet_wrap(~measure, scales = "free", ncol = 2)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

meta %>% 
  filter(varname %in% c("consproviders", "busproviders", "avgMaxAdDown", "avgMaxAdUp")) %>%
  mutate(label = paste0(varname, ": ", about)) %>% 
  select(label) %>% 
  as.list()

$label [1] "consproviders: The number of consumer internet providers in the su"
[2] "busproviders: The number of business internet providers in the su"
[3] "avgMaxAdDown: The average maximum advertised download speed by each broadband provider in the su" [4] "avgMaxAdUp: The average maxmum advertised upload speed by each broadband provider in the su"

Mapping the data

Number of consumer internet providers

pal <- colorNumeric("plasma", reverse = TRUE, domain = mapdat$consproviders)

leaflet() %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  addPolygons(data = mapdat,
              fillColor = ~pal(consproviders),
              weight = 1,
              opacity = 1,
              color = "white", 
              fillOpacity = 0.6,
              highlight = highlightOptions(
                weight = 2,
                fillOpacity = 0.8,
                bringToFront = T
              ),
              popup = paste0("GEOID: ", mapdat$BlockCode, "<br>",
                             "Number of internet providers: ", mapdat$consproviders)
  ) %>% 
  addLegend("bottomright", pal = pal, values = mapdat$consproviders, 
            title = "Number of internet <br> providers per block", opacity = 0.7)

Average maximum advertised download speeds

pal <- colorNumeric("plasma", reverse = TRUE, domain = mapdat$avgMaxAdDown) 

leaflet() %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  addPolygons(data = mapdat,
              fillColor = ~pal(avgMaxAdDown),
              weight = 1,
              opacity = 1,
              color = "white", 
              fillOpacity = 0.6,
              highlight = highlightOptions(
                weight = 2,
                fillOpacity = 0.8,
                bringToFront = T
              ),
              popup = paste0("GEOID: ", mapdat$BlockCode, "<br>",
                             "Average max advertised <br> download speeds: ", round(mapdat$avgMaxAdDown, 2))
  ) %>% 
  addLegend("bottomright", pal = pal, values = mapdat$avgMaxAdDown, 
            title = "Average maximum <br> advertised download <br> speeds per block", opacity = 0.7)

Average maximum advertised upload speeds

pal <- colorNumeric("plasma", reverse = TRUE, domain = mapdat$avgMaxAdUp)

leaflet() %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  addPolygons(data = mapdat,
              fillColor = ~pal(avgMaxAdUp),
              weight = 1,
              opacity = 1,
              color = "white", 
              fillOpacity = 0.6,
              highlight = highlightOptions(
                weight = 2,
                fillOpacity = 0.8,
                bringToFront = T
              ),
              popup = paste0("GEOID: ", mapdat$BlockCode, "<br>",
                             "Average max <br> advertised upload speeds: ", round(mapdat$avgMaxAdUp, 2))
  ) %>% 
  addLegend("bottomright", pal = pal, values = mapdat$avgMaxAdUp, 
            title = "Average maximum <br> advertised <br> upload speeds per block", opacity = 0.7)

Blocks that don't meet the FCC threshold for "advanced telecommunications capability"

  • Blocks with a value of one on this map do not meet the 25/3 Mbps bandwidth based on their providers' average maximum advertised download and upload speeds
pal <- colorFactor("plasma", reverse = TRUE, domain = mapdat$under25.3mbps)

leaflet() %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  addPolygons(data = mapdat,
              fillColor = ~pal(under25.3mbps),
              weight = 1,
              opacity = 1,
              color = "white", 
              fillOpacity = 0.6,
              highlight = highlightOptions(
                weight = 2,
                fillOpacity = 0.8,
                bringToFront = T
              ),
              popup = paste0("GEOID: ", mapdat$BlockCode, "<br>",
                             "No advanced <br>telecommunications capability: ", mapdat$under25.3mbps)
  ) %>% 
  addLegend("bottomright", pal = pal, values = c(0,1), 
            title = "No advanced  <br>telecommunications <br>capability", opacity = 0.7)